package main

import "fmt"

func main() {
	/*
		结构体：是由一系列具有相同类型或不同类型的数据构成的数据集合
			结构体成员是由一系列的成员变量构成，这些成员变量也被称为“字段“

		使用 new 创建内置函数，字段默认初始化为其类型的零值，返回值是指向结构体的指针（不推荐使用）

		结构体成员：
			定义时要区分大小写
				如果首字母大写 表示这个成员是公有的，对外可见，其他人通过导入包后也可以使用
				如果首字母小写 表示这个成员是私有的，对外不可见

		结构体实例化：
			结构体的定义只是⼀种内存布局的描述，只有当结构体实例化时，才会真正分配内存。因此必须在定义结构体并实例化后才能使⽤结构体；
			实例化就是根据结构体定义的格式创建⼀份与格式⼀致的内存区域。
			结构体实例之间的内存是完全独⽴的
	*/
	//创建结构体对象
	//除最后一种外，如果某个字段没有数值的话也可以不写，默认为该字段数据类型的 0 值
	//1.方法一
	var p1 Person
	fmt.Println(p1) //{ 0  }
	p1.name = "喜羊羊"
	p1.sex = "男"
	p1.address = "青青草原羊村"
	p1.age = 18
	fmt.Printf("姓名：%s，年龄：%d，性别：%s，地址：%s\n", p1.name, p1.age, p1.sex, p1.address)

	//2.方法二
	p2 := Person{}
	p2.name = "灰太狼"
	p2.age = 36
	p2.address = "青青草原狼堡"
	p2.sex = "男"
	fmt.Printf("姓名：%s，年龄：%d，性别：%s，地址：%s\n", p2.name, p2.age, p2.sex, p2.address)

	//3.方法三
	p3 := Person{name: "孙悟空", age: 50000, sex: "男", address: "花果山水帘洞"}
	fmt.Println(p3)
	p4 := Person{
		name:    "美羊羊",
		age:     18,
		sex:     "女",
		address: "青青草原羊村",
	}
	fmt.Println(p4)

	//4.方法四
	//要按照定义结构体时的顺序写(不推荐，如果结构体中的字段改变了，容易发生错误)
	p5 := Person{"小灰灰", 7, "男", "青青草原狼堡"}
	fmt.Println(p5)
}

// 1.定义结构体
type Person struct {
	name    string
	age     int
	sex     string
	address string
}
